MongoDB on AWS Cloud その3:Upgrade to MongoDB 3.2
こんにちは、菊池です。
今回はMongoDB on AWS 第3弾として、MongoDBの最新バージョンである3.2へのアップグレードを行います。
過去の記事:
MongoDB Ver 3.2
MongoDB Ver. 3.2 は2015年12月にリリースされた最新のメジャーバージョンです。1つ前の3.0から以下のような変更・機能追加があります。
- ストレージエンジンとしてWiredTigerがデフォルトに
- レプリカセットのフェイルオーバー高速化
- Configサーバでのレプリカセット構成サポート
- Read Concern(読み込み保証)のサポート
- 部分Index
- ドキュメントバリデーション
- Aggregation Frameworkの拡張
また、有償のEnterprise版に限りますが、
- In-Memoryストレージエンジンの追加(3.2.6以降)
- WiredTigerで暗号化に対応
などがあります。2.6 -> 3.0 のWiredTigerのような大きな変更はありませんが、アプリケーション開発や運用管理においてより使いやすくなる機能が追加されています。
なお、2016/10/6時点の最新マイナーバージョンは 3.2.10 です。
環境・前提条件
環境は、前々回で紹介しました、テンプレートで構築されるクラスタ環境(1 Shard / 3 Node Reprication)です。
また、作業の前提として、MongoDB 3.0からのアップグレードとなります。2.6からアップグレードする際は、一度3.0にアップグレードしておく必要があります。
今回の環境は3.0系の最新である3.0.12が稼働しています。
Upgrade手順
それではUpgradeです。手順サマリは以下のようになります。
- Balancer停止
- Dataノードのローリングアップグレード
- Configサーバのローリングアップグレード
- mongosのアップグレード
- Balancer再開
シャーディングしていないレプリカセットのみの構成であれば、上記2の手順のみとなります。
Balancer停止
まずは事前作業として、シャーディング時にデータチャンクを移動させる働きを持つBalancerを停止します。mongosにログイン(今回の構成ではPrimaryノードで起動)し、sh.getBalancerState()
でBalancerの状態確認、sh.stopBalancer()
で停止します。
$ mongo MongoDB shell version: 3.0.12 connecting to: test mongos> sh.getBalancerState() true mongos> sh.stopBalancer() Waiting for active hosts... Waiting for the balancer lock... Waiting again for active hosts after balancer is off... WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : "balancer" }) mongos> sh.getBalancerState() false mongos>
Dataノードのローリングアップグレード
Dataノードの作業です。まずはPrimaryにログインし、状態を確認します。
$ mongo localhost:27018 MongoDB shell version: 3.0.12 connecting to: localhost:27018/test s0-rs0:PRIMARY> db.version() 3.0.12 s0-rs0:PRIMARY> db.serverStatus().storageEngine { "name" : "mmapv1" } s0-rs0:PRIMARY>
バージョンは3.0.12、ストレージエンジンはMMAPv1です。レプリカセットの状態も確認しておきます。
s0-rs0:PRIMARY> rs.status() { "set" : "s0-rs0", "date" : ISODate("2016-10-06T01:32:08.692Z"), "myState" : 1, "members" : [ { "_id" : 1, "name" : "10.0.3.34:27018", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 2168, "optime" : Timestamp(1475715427, 1), "optimeDate" : ISODate("2016-10-06T00:57:07Z"), "lastHeartbeat" : ISODate("2016-10-06T01:32:08.012Z"), "lastHeartbeatRecv" : ISODate("2016-10-06T01:32:07.344Z"), "pingMs" : 0, "syncingTo" : "10.0.2.24:27018", "configVersion" : 1 }, { "_id" : 2, "name" : "10.0.2.24:27018", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 2168, "optime" : Timestamp(1475715427, 1), "optimeDate" : ISODate("2016-10-06T00:57:07Z"), "electionTime" : Timestamp(1475715363, 1), "electionDate" : ISODate("2016-10-06T00:56:03Z"), "configVersion" : 1, "self" : true }, { "_id" : 3, "name" : "10.0.4.172:27018", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 2069, "optime" : Timestamp(1475715427, 1), "optimeDate" : ISODate("2016-10-06T00:57:07Z"), "lastHeartbeat" : ISODate("2016-10-06T01:32:08.392Z"), "lastHeartbeatRecv" : ISODate("2016-10-06T01:32:07.823Z"), "pingMs" : 2, "syncingTo" : "10.0.2.24:27018", "configVersion" : 1 } ], "ok" : 1 } s0-rs0:PRIMARY>
まずはSecondaryの2ノードをアップグレードします。Secondaryのどちらかにログインし、MongoDBのサーバサービスであるmongod0を停止します。
$ sudo service mongod0 stop Stopping mongod: [ OK ]
インストールされているMongoDB関連のパッケージを確認します。
$ sudo yum list installed | grep mongo mongodb-org.x86_64 3.0.12-1.amzn1 @mongodb-org-3.0 mongodb-org-mongos.x86_64 3.0.12-1.amzn1 @mongodb-org-3.0 mongodb-org-server.x86_64 3.0.12-1.amzn1 @mongodb-org-3.0 mongodb-org-shell.x86_64 3.0.12-1.amzn1 @mongodb-org-3.0 mongodb-org-tools.x86_64 3.0.12-1.amzn1 @mongodb-org-3.0
後から作業するmongosを除き、全てアンインストール。
$ sudo yum remove mongodb-org mongodb-org-server mongodb-org-shell mongodb-org-tools
MongoDB3.2をyumでインストールするため、/etc/yum.repos.d/mongodb-org-3.2.repo
に以下を記述。
[mongodb-org-3.2] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/3.2/x86_64/ gpgcheck=1 enabled=1 gpgkey=https://www.mongodb.org/static/pgp/server-3.2.asc
mongosを除く、server、shell、toolsをインストール。
$ sudo yum install mongodb-org-server mongodb-org-shell mongodb-org-tools
インストールできました。
$ sudo yum list installed | grep mongo mongodb-org-mongos.x86_64 3.0.12-1.amzn1 @mongodb-org-3.0 mongodb-org-server.x86_64 3.2.10-1.amzn1 @mongodb-org-3.2 mongodb-org-shell.x86_64 3.2.10-1.amzn1 @mongodb-org-3.2 mongodb-org-tools.x86_64 3.2.10-1.amzn1 @mongodb-org-3.2
これで mongod0 の起動が可能ですが、このままだと旧バージョンで作成されたMMAPv1のデータファイルが残ったままです。Ver.3.2ではWiredTigerがデフォルトですが、/etc/mongod0.cong
のdbPath:
に記載のディレクトリにMMAPv1のデータファイルが残っていると、MMAPv1として起動します。WiredTigerとしたい場合には、dbPath:
のディレクトリを変更するか、データファイルを一度削除します。
$ sudo rm -rf /data/s0-rs0/*
この状態で起動することで、他のレプリカセットからデータ同期を行う際に WiredTiger で再構築されます。
それではmongod0を起動します。
$ sudo service mongod0 start Starting mongod: [ OK ]
DBに接続し、バージョンとストレージエンジンを確認します。
$ mongo localhost:27018 MongoDB shell version: 3.2.10 connecting to: localhost:27018/test s0-rs0:SECONDARY> db.version() 3.2.10 s0-rs0:SECONDARY> db.serverStatus().storageEngine { "name" : "wiredTiger", "supportsCommittedReads" : true, "persistent" : true } s0-rs0:SECONDARY>
これで、バージョン:3.2.10、ストレージエンジン:WiredTigerで起動しました。
ちなみに、MMAPv1のままで起動した場合には、db.serverStatus().storageEngine
の出力は以下のようになります。
s0-rs0:SECONDARY> db.serverStatus().storageEngine { "name" : "mmapv1", "supportsCommittedReads" : false, "persistent" : true } s0-rs0:SECONDARY>
これでDataノード1台のアップグレードが完了です。同じ手順で、もう一台のSecondaryノード、Primaryノードもバージョンアップを行います。
全てのレプリカセットメンバーのアップグレードが完了したら、レプリケーションプロトコルのバージョンアップを行います。Primaryノードにログインし、以下のコマンドを実行します。
s0-rs0:PRIMARY> cfg = rs.conf(); s0-rs0:PRIMARY> cfg.protocolVersion=1; 1 s0-rs0:PRIMARY> rs.reconfig(cfg); { "ok" : 1 } s0-rs0:PRIMARY>
以上でDataノードのアップグレードは完了です。
Configサーバのローリングアップグレード
次に、Configサーバのアップグレードです。基本的には上記Dataノードの手順を同じになりますが、以下の点に注意して下さい。
- テンプレートから構築した構成の場合、設定ファイル/etc/mongod.confがアップグレード時に上書きされてしまいます。事前に退避し後で書き換えるようにして下さい。
- Configサーバはレプリカセットになっていません(独立した3台のサーバ)。なので、データファイルを削除してしまうと起動後に自動で同期されません。そのまま残してMMAPv1で起動するか、作業前にエクスポートしアップグレード後にインポートする必要があります。本手順ではMMAPv1のままとします。
まずはConfigServer00にてmongodを停止します。
$ sudo service mongos stop Stopping mongod: [ OK ]
設定ファイル<code>/etc/mongod.conf</code>を退避します。
$ sudo cp -p /etc/mongod.conf ~/
インストール済みのパッケージを確認。
$ sudo yum list installed | grep mongo mongodb-org.x86_64 3.0.12-1.amzn1 @mongodb-org-3.0 mongodb-org-mongos.x86_64 3.0.12-1.amzn1 @mongodb-org-3.0 mongodb-org-server.x86_64 3.0.12-1.amzn1 @mongodb-org-3.0 mongodb-org-shell.x86_64 3.0.12-1.amzn1 @mongodb-org-3.0 mongodb-org-tools.x86_64 3.0.12-1.amzn1 @mongodb-org-3.0
全てアンインストールします。Configサーバではmongosを起動していませんので、mongosも不要です。
$ sudo yum remove mongodb-org mongodb-org-mongos mongodb-org-server mongodb-org-shell mongodb-org-tools
yumで3.2をインストールするため、/etc/yum.repos.d/mongodb-org-3.2.repo
に以下を記述。
[mongodb-org-3.2] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/3.2/x86_64/ gpgcheck=1 enabled=1 gpgkey=https://www.mongodb.org/static/pgp/server-3.2.asc
Ver.3.2を一式インストールします。
$ sudo yum install mongodb-org mongodb-org-mongos mongodb-org-server mongodb-org-shell mongodb-org-tools
退避していたmongod.conf
を戻します。
$ sudo mv ~/mongod.conf /etc/mongod.conf
mongodを起動。
$ sudo service mongod start Starting mongod: [ OK ]
Configサーバに接続し、バージョンを確認。
$ mongo localhost:27030 configsvr> db.version() 3.2.10 configsvr>
これで1台目のConfigサーバがアップグレードできました。続けて同じ手順で残り2台のConfigサーバをアップグレードします。
mongosのアップグレード
最後にmongosのアップグレードです。以下の点にご注意ください。
- 必ずConfigサーバのアップグレード後に作業してください。mongosをConfigサーバより先にアップグレードすると、mongosが起動できなくなります。
mongosが稼働するPrimary00で作業します。まずはmongosを停止します。
$ sudo service mongos stop Stopping mongod: [ OK ]
mongosをアンインストール。
$ sudo yum remove mongodb-org-mongos
Ver.3.2のmongosをインストール(前述の作業で、作業対象ノードに/etc/yum.repos.d/mongodb-org-3.2.repo
がある前提)
$ sudo yum install mongodb-org-mongos
インストールされたパッケージを確認します。
$ sudo yum list installed | grep mongo mongodb-org.x86_64 3.2.10-1.amzn1 @mongodb-org-3.2 mongodb-org-mongos.x86_64 3.2.10-1.amzn1 @mongodb-org-3.2 mongodb-org-server.x86_64 3.2.10-1.amzn1 @mongodb-org-3.2 mongodb-org-shell.x86_64 3.2.10-1.amzn1 @mongodb-org-3.2 mongodb-org-tools.x86_64 3.2.10-1.amzn1 @mongodb-org-3.2
mongosを起動。
$ sudo service mongos start Starting mongod: [ OK ]
mongosに接続し、シャードステータスを確認します。
$ mongo MongoDB shell version: 3.2.10 connecting to: test mongos> mongos> sh.status() --- Sharding Status --- sharding version: { "_id" : 1, "minCompatibleVersion" : 5, "currentVersion" : 6, "clusterId" : ObjectId("57f4aa7e3c227d2423e5fb0d") } shards: { "_id" : "s0-rs0", "host" : "s0-rs0/10.0.2.24:27018,10.0.3.34:27018,10.0.4.172:27018" } active mongoses: "3.2.10" : 1 balancer: Currently enabled: no Currently running: no Failed balancer rounds in last 5 attempts: 0 Migration Results for the last 24 hours: No recent migrations databases: { "_id" : "admin", "partitioned" : false, "primary" : "config" } { "_id" : "testDB", "partitioned" : false, "primary" : "s0-rs0" } { "_id" : "test", "partitioned" : false, "primary" : "s0-rs0" } mongos>
以上でmongosのバージョンアップは完了です。
Balancer再開
作業開始時に停止したBalancerを再開します。
mongos> sh.getBalancerState() false mongos> sh.startBalancer() WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) mongos> sh.getBalancerState() true mongos>
これで全ての作業が完了です。MongoDB関連のコンポーネントが全て最新の3.2.12にアップゲレードされました。
まとめ
テンプレートから構築されたMongoDBを最新版にアップグレードする手順を紹介しました。
MongoDBは非常にシンプルな構造であることと、一部制限はあるもののクラスタ内で異なるバージョン/ストレージエンジンが混在できることで簡単なローリングアップグレードが可能になっています。
今回は3.0からのアップグレードということもあり、3.2からサポートされたConfigサーバのレプリカセットへの変更は行いませんでした。スタンドアロンのConfigサーバをレプリカセットへ移行する手順についても今後紹介していきたいと思います。
参考リンク